// 包声明：将Test类放在com.itheima.polymorphsm1包下，方便组织和管理代码
package com.itheima.polymorphsm1;

// 定义一个公共的Test类，public表示这个类可以被其他包访问
public class Test {
    // main方法：Java程序的入口点，程序从这里开始执行
    // public：公共访问权限
    // static：静态方法，可以直接通过类名调用
    // void：无返回值
    // String[] args：命令行参数数组
    public static void main(String[] args) {
        // 注释：这里说明了这段代码的学习目标，是为了认识多态的代码形式
        // 注释：多态主要体现在两个方面：对象多态和行为多态
        // 创建一个Wolf对象，并赋值给Animal类型的变量a1
        // 这体现了对象多态：父类引用指向子类对象
        // Animal是父类，Wolf是Animal的子类
        Animal a1 = new Wolf();
        // 调用a1对象的run方法
        // 这里体现了行为多态：方法调用遵循"编译看左边，运行看右边"的规则
        // 编译时检查Animal类是否有run方法，运行时执行Wolf类重写的run方法
        a1.run(); // 方法：编译看左边，运行看右边
        // 访问a1对象的name成员变量
        // 成员变量访问遵循"编译看左边，运行也看左边"的规则
        // 这里会输出Animal类中定义的name变量值，而不是Wolf类中可能定义的同名变量
        System.out.println(a1.name); // 成员变量：编译看左边，运行也看左边

        // 创建一个Tortoise对象，并赋值给Animal类型的变量a2
        // 同样体现了对象多态：父类引用指向不同的子类对象
        Animal a2 = new Tortoise();
        // 调用a2对象的run方法
        // 同样遵循方法调用的多态规则，会执行Tortoise类重写的run方法
        a2.run(); // 方法：编译看左边，运行看右边
        // 访问a2对象的name成员变量
        // 同样遵循成员变量访问规则，输出Animal类中定义的name变量值
        System.out.println(a2.name); // 成员变量：编译看左边，运行也看左边
    }
    // main方法结束
}
// Test类结束
